package org.short_address;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * @version v1.0.0
 * 创建时间：2022/6/27 17:40
 */
public class ShortUrl {
    /**
     * 短url设计方案，将长url转化为短url
     *
     * 功能设计需求：
     *      1.给定原始URL，返回短url，长度为7个字符 done
     *      2.用户访问 short url，系统重定向到原始URL done
     *      3.支持用户自定义short url
     *      4.short url有默认过期时间，用户也可以指定过期时间
     * 非功能型需求:
     *      1.高可用
     *      2.低时延
     *      3.安全,不可预测生成的短url
     *      4.标准化接口
     * 系统MUA以及数据容量预估：
     *     MUA：30M
     *     数据容量模型：
     *         long url : 2KB (2048 characters)
     *         short url : 7B (7 characters)
     *         created_at: 7B
     *         total ：2.014KB
     *     容量预估
     *         60 GB/m
     *         0.7 TB/y
     *         3.5 TB / 5years
     */
    String DEFAULT_CUSTOM_ALIAS = "";
    String DEFALUT_EXPIRE_DATE = "";
    Map<String,String> db = new HashMap();

    Map<String,Long> idService = new HashMap<>();

    public ShortUrl(){
        idService.put("www.baidu.com",15236567L);
    }
    private String createUrl(String user_account_key,String origin_url){
        return this.createUrl(user_account_key,origin_url,DEFAULT_CUSTOM_ALIAS,DEFALUT_EXPIRE_DATE);
    }

    private String createUrl(String user_account_key,String origin_url,String custom_alias){
        return this.createUrl(user_account_key,origin_url,custom_alias,DEFALUT_EXPIRE_DATE);
    }

    /**
     * create a short url mapping a long url, a short url only has a long url.
     * @param user_account_key user key ,to limit user operate
     * @param origin_url the origin url for long url
     * @param custom_alias user custom_alias for short url
     * @param expire_date the expire time for short url
     * @return the short url
     */
    private String createUrl(String user_account_key,String origin_url,String custom_alias,String expire_date){
        // 从数据库查找
        if(db.get(origin_url)!=null){
            return db.get(origin_url);
        }
        // get id by origin_url
        long id = idService.get(origin_url);
        // base62 编码id得到 short_url,插入数据库并返回
        String base62 = get_base62(id);
        return base62;
    }

    private String get_base62(long id){
        String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRStUVWXYZ0123456789";
        StringBuilder ret = new StringBuilder();
        for (int i = 0; i < 7; i++) {
            long idx = id % 62; // 7次最多2^6*7 = 2^42 次方,即最大到数字2^42次方
            ret.append(base.charAt((int)idx));
            id = id / 62;
        }
        // 7位62编码,数据到达6^27 (3,521,614,606,208),按30M/month,可以用9000多年
        return ret.reverse().toString();
    }

    public static void main(String[] args) {
        String user1 = new ShortUrl().createUrl("user1", "www.baidu.com");
        System.out.println(user1);
    }

}
